﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "IUnCommandControlDefinition.h"
#include "Any.h"

namespace gcmp
{
    class IComboBoxHandler;
    class IComboBoxEvent;
    class IControlState;

    /// \brief ComboBox控件数据定义接口
    class GCMP_GUI_BASE_INTERFACE_EXPORT IComboBoxDefinition : public IUnCommandControlDefinition
    {
    public:
        /// \brief 创建IComboBoxDefinition对象
        ///
        /// \param id       ComboBox控件数据定义的Id,需保证唯一性
        /// \param caption    ComboBox控件标题
        /// \return  创建出IComboBoxDefinition对象。失败时返回空
        static OwnerPtr<IComboBoxDefinition> Create(const std::wstring& id, const std::wstring& caption);

        /// \brief 创建pLineEditDefinition的引用
        ///
        /// 不能通过引用创建引用； pLineEditDefinition需加到IControlDefinitionLibrary时才能创建引用对象
        /// \param pLineEditDefinition   ILineEditDefinition对象
        /// \return  创建出ILineEditDefinition对象。失败时返回空
        static OwnerPtr<IComboBoxDefinition> CreateReference(const IComboBoxDefinition* pComboBoxDefinition);

        /// \brief 添加item至最后
        ///
        /// \param item    ComboBox下拉框显示文字
        /// \param useData  item设置的用户数据
        /// \return   true表示成功，false表示失败
        virtual bool AddItem(const std::wstring& item, Any useData) = 0;

        /// \brief 添加item至最后
        ///
        /// \param item    ComboBox下拉框显示文字
        /// \return   true表示成功，false表示失败
        virtual bool AddItem(const std::wstring& item) = 0;

        /// \brief 得到所有的item
        ///
        /// \return Item集合
        virtual std::vector<std::wstring> GetAllItems() const = 0;

        /// \brief 删除Item
        ///
        /// \param index    将删除的索引
        /// \return  true表示成功，false表示失败
        virtual bool DeleteItem(int index) = 0;

        /// \brief 删除所有Item
        ///
        /// \return true表示成功，false表示失败
        virtual bool DeleteAllItems() = 0;

        /// \brief 插入Item
        ///
        /// \index   将插入的Item的索引位置
        /// \param text    ComboBox下拉框显示文字
        /// \param userData  item设置的用户数据
        /// \return     true表示成功， false表示失败
        virtual bool InsertItem(int index, const std::wstring &text, Any userData) = 0;

        /// \brief 插入Item
        ///
        /// \index   将插入的Item的索引位置
        /// \param text    ComboBox下拉框显示文字
        /// \return     true表示成功， false表示失败
        virtual bool InsertItem(int index, const std::wstring &text) = 0;


        /// \brief 设置索引为currentIndex的item为当前的item
        /// \param currentIndex   索引 
        /// \return  true表示成功，false表示失败
        virtual bool SetCurrentIndex(int currentIndex) = 0;

        /// \brief 得到当前item的index
        ///
        ///  对于空的ComboBox或未设置当前项的ComboBox,返回 -1。
        virtual int GetCurrentIndex() const = 0;

        /// \brief 得到当前item显示的文字
        virtual std::wstring GetCurrentText() const = 0;
        
        /// \brief 得到当前item设置的用户数据
        virtual Any GetCurrentData() const = 0;

        /// \brief 设置ComboBox的可见及可用状态以及执行函数
        ///
        /// \param pControlHandler ComboBox控件处理者
        /// \return     true表示成功，false表示失败
        virtual bool SetControlHandler(OwnerPtr<IComboBoxHandler> pControlHandler) = 0;
        
        
//////////////////////////////////////////////////////////////////////////////////////////        
        /// \brief 设置ComboBox的可用性 （相关代码会调整，请勿使用）
        ///
        /// 通过SetControlState设置后，SetEnabled将不起作用
        /// \param enabled true代表设置可用，false代表设置不可用
        /// \return     true表示成功，false表示失败
        virtual bool SetEnabled(bool enabled) = 0;

        /// \brief 设置ComboBox的可见性 （相关代码会调整，请勿使用）
        ///
        /// 通过SetControlState设置后，SetVisible将不起作用
        /// \param visible true代表设置可见，false代表设置不可见
        /// \return     true表示成功，false表示失败
        virtual bool SetVisible(bool visible) = 0;

        /// \brief 得到IComboBoxEvent对象（相关代码会调整，请勿使用）
        ///
        /// \return  IComboBoxEvent对象
        virtual IComboBoxEvent* GetEvent() const = 0;
    };
}
